package br.com.insight.consultoria.integracao.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.springframework.dao.DataAccessException;

import br.com.insight.consultoria.entity.Area;
import br.com.insight.consultoria.entity.ConhecimentoLinguaEstrangeira;
import br.com.insight.consultoria.entity.Tipo;
import br.com.insight.consultoria.entity.Usuario;
import br.com.insight.consultoria.erro.exception.InsightConstants;
import br.com.insight.consultoria.erro.exception.InsightDaoException;
import br.com.insight.consultoria.erro.exception.InsightException;
import br.com.insight.consultoria.erro.exception.SistemaException;
import br.com.insight.consultoria.integracao.dao.genericdao.GenericDAO;
import br.com.insight.consultoria.integracao.dao.interfacedao.ConhecimentoLinguaEstrangeiraDAO;

public class ConhecimentoLinguaEstrangeiraImpDAO extends GenericDAO implements ConhecimentoLinguaEstrangeiraDAO{

	
	 @Override
	public void inserir(ConhecimentoLinguaEstrangeira conhecimentoUsuario)
			throws InsightException {
		
		 try{
			 
			 saveOrUpdateEntity(conhecimentoUsuario);
			 
			}catch(DataAccessException sql){
				
				throw new InsightDaoException(InsightConstants.MENSAGEM_ERRO_ACESSO_BANCO,sql);
			
			}catch(Exception ex){
				
				throw new SistemaException(InsightConstants.MENSAGEM_ERRO_NAO_TRATADO,ex);
				
			}
		
	}
	 
	 @Override
	public void alterar(ConhecimentoLinguaEstrangeira conhecimentoUsuario)
			throws InsightException {
		
		 try{
			 
			 saveOrUpdateEntity(conhecimentoUsuario);
			 
			}catch(DataAccessException sql){
				
				throw new InsightDaoException(InsightConstants.MENSAGEM_ERRO_ACESSO_BANCO,sql);
			
			}catch(Exception ex){
				
				throw new SistemaException(InsightConstants.MENSAGEM_ERRO_NAO_TRATADO,ex);
				
			}
			 
	}
	 
	 @Override
	public void excluir(ConhecimentoLinguaEstrangeira conhecimentoUsuario)
			throws InsightException {
		
		 try{
			 
			 deleteEntity(conhecimentoUsuario);
			 
			}catch(DataAccessException sql){
				
				throw new InsightDaoException(InsightConstants.MENSAGEM_ERRO_ACESSO_BANCO,sql);
			
			}catch(Exception ex){
				
				throw new SistemaException(InsightConstants.MENSAGEM_ERRO_NAO_TRATADO,ex);
				
			}
			 
	}
	 
	 @Override
	public ConhecimentoLinguaEstrangeira getConhecimentoUsuario(ConhecimentoLinguaEstrangeira.IdLinguaEstrangeiraUsuario id)
			throws InsightException {
		
		 ConhecimentoLinguaEstrangeira conhecimentoUsuario=null;
		 
		 try{
		 
			 conhecimentoUsuario=(ConhecimentoLinguaEstrangeira) getEntityById(ConhecimentoLinguaEstrangeira.class, id);
			 
			}catch(DataAccessException sql){
				
				throw new InsightDaoException(InsightConstants.MENSAGEM_ERRO_ACESSO_BANCO,sql);
			
			}catch(Exception ex){
				
				throw new SistemaException(InsightConstants.MENSAGEM_ERRO_NAO_TRATADO,ex);
				
			}
			 
		return conhecimentoUsuario;
	}

	@Override
	public List<ConhecimentoLinguaEstrangeira> pesquisar(Usuario usuario)
			throws InsightException {
		
		List<ConhecimentoLinguaEstrangeira> conhecimentoUsuario=null;
		
		try{
			
			conhecimentoUsuario=findFiltered(ConhecimentoLinguaEstrangeira.class,"usuario", usuario);
			
		}catch(DataAccessException sql){
			
			throw new InsightDaoException(InsightConstants.MENSAGEM_ERRO_ACESSO_BANCO,sql);
		
		}catch(Exception ex){
			
			throw new SistemaException(InsightConstants.MENSAGEM_ERRO_NAO_TRATADO,ex);
			
		}
			
		return conhecimentoUsuario;
	}
	
	@Override
	public List<ConhecimentoLinguaEstrangeira> pesquisar(Usuario usuario, Tipo tipo)
			throws InsightException {
		
		List<ConhecimentoLinguaEstrangeira> conhecimentoUsuario=null;
		
		try{
			
			conhecimentoUsuario=getHibernateTemplate().find("from ConhecimentoUsuario c where c.usuario="+usuario.getId()+" and c.tipo= "+tipo.getId());
			
		}catch(DataAccessException sql){
			
			throw new InsightDaoException(InsightConstants.MENSAGEM_ERRO_ACESSO_BANCO,sql);
		
		}catch(Exception ex){
			
			throw new SistemaException(InsightConstants.MENSAGEM_ERRO_NAO_TRATADO,ex);
			
		}
		
		return conhecimentoUsuario;
	}
	
	@Override
	public List<ConhecimentoLinguaEstrangeira> pesquisar(Usuario usuario, Area area)
			throws InsightException {
		
		List<ConhecimentoLinguaEstrangeira> conhecimentoUsuario=new ArrayList<ConhecimentoLinguaEstrangeira>();
		
		try{
			
			Iterator iterator =getHibernateTemplate().find("from Area a,Tipo t,ConhecimentoUsuario uc " +
					"where a.id=t.area " +
					"and t.id=uc.tipo " +
					"and a.id="+area.getId()+
					"and uc.usuario="+usuario.getId()+"order by uc.tipoEspecifico asc").iterator();
			
			while (iterator.hasNext()) {
				Object[] object = (Object[])iterator.next();
				conhecimentoUsuario.add((ConhecimentoLinguaEstrangeira)object[2]);
			}
			

			
		}catch(DataAccessException sql){
			
			throw new InsightDaoException(InsightConstants.MENSAGEM_ERRO_ACESSO_BANCO,sql);
		
		}catch(Exception ex){
			
			throw new SistemaException(InsightConstants.MENSAGEM_ERRO_NAO_TRATADO,ex);
			
		}
		
		return conhecimentoUsuario;
	}
	
}
